/**
 * 文本格式处理工具
 * 处理文本格式保留、转换等功能
 */

/**
 * 保留文本格式，确保换行符和段落结构保持不变
 * @param text 原始文本
 * @returns 保留格式的文本
 */
export function preserveTextFormat(text: string): string {
    if (!text) return '';
    
    // 规范化换行符 (不同操作系统可能使用不同的换行符)
    let normalized = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
    
    // 确保段落之间有足够的换行
    normalized = normalized.replace(/\n{3,}/g, '\n\n');
    
    return normalized;
}

/**
 * 将纯文本转换为HTML格式，保留段落和换行
 * 适用于在HTML环境中显示纯文本内容
 * @param text 纯文本内容
 * @returns HTML格式的文本
 */
export function textToHtml(text: string): string {
    if (!text) return '';
    
    // 首先进行格式保留处理
    const formatted = preserveTextFormat(text);
    
    // 将换行符转换为HTML段落和换行标签
    return formatted
        // 首先将段落（由两个或更多换行符分隔）替换为HTML段落
        .split(/\n{2,}/)
        .map(paragraph => `<p>${paragraph}</p>`)
        .join('')
        // 然后处理段落内的单个换行符
        .replace(/\n/g, '<br>');
}

/**
 * 从HTML内容提取纯文本，保留基本格式
 * @param html HTML格式的内容
 * @returns 提取的纯文本
 */
export function htmlToText(html: string): string {
    if (!html) return '';
    
    // 处理常见的HTML段落和换行标签，转换为纯文本段落格式
    let text = html
        // 替换段落标签为换行符
        .replace(/<p[^>]*>/gi, '')
        .replace(/<\/p>/gi, '\n\n')
        // 替换换行标签
        .replace(/<br[^>]*>/gi, '\n')
        .replace(/<div[^>]*>/gi, '')
        .replace(/<\/div>/gi, '\n')
        // 替换标题标签
        .replace(/<h[1-6][^>]*>/gi, '')
        .replace(/<\/h[1-6]>/gi, '\n\n')
        // 替换列表项
        .replace(/<li[^>]*>/gi, '• ')
        .replace(/<\/li>/gi, '\n')
        // 替换其他常见块级元素
        .replace(/<(blockquote|article|section|header|footer)[^>]*>/gi, '')
        .replace(/<\/(blockquote|article|section|header|footer)>/gi, '\n\n');
    
    // 移除所有剩余的HTML标签
    text = text.replace(/<[^>]+>/g, '');
    
    // 解码HTML实体
    text = decodeHtmlEntities(text);
    
    // 规范化空白字符和换行
    text = text.replace(/\n{3,}/g, '\n\n');  // 最多保留两个连续换行
    text = text.replace(/^\s+|\s+$/g, '');   // 移除首尾空白
    
    return text;
}

/**
 * 解码HTML实体
 * @param text 包含HTML实体的文本
 * @returns 解码后的文本
 */
function decodeHtmlEntities(text: string): string {
    const entities = {
        '&nbsp;': ' ',
        '&amp;': '&',
        '&lt;': '<',
        '&gt;': '>',
        '&quot;': '"',
        '&#39;': "'",
        '&apos;': "'",
        '&mdash;': '—',
        '&ndash;': '–',
        '&ldquo;': '"',
        '&rdquo;': '"',
        '&lsquo;': "'",
        '&rsquo;': "'"
    };
    
    // 替换常见HTML实体
    let decoded = text;
    for (const [entity, char] of Object.entries(entities)) {
        decoded = decoded.replace(new RegExp(entity, 'g'), char);
    }
    
    // 处理数字形式的HTML实体
    decoded = decoded.replace(/&#(\d+);/g, (_, dec) => String.fromCharCode(parseInt(dec, 10)));
    
    return decoded;
}

/**
 * 将HTML内容清理为纯文本用于保存
 * 保留段落结构和基本格式，但移除所有HTML标签
 * @param htmlContent 富文本编辑器的HTML内容
 * @returns 适合保存的纯文本内容
 */
export function cleanHtmlForSaving(htmlContent: string): string {
    return htmlToText(htmlContent);
} 